package com.second.hand.trading.server;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;

/**
 * LogCostInterceptor 用于记录每个 HTTP 请求的处理耗时。
 * 实现了 Spring 的 HandlerInterceptor 接口，可以在请求处理的不同阶段插入自定义逻辑。
 */
public class LogCostInterceptor implements HandlerInterceptor {
    // 记录请求开始时间（单位：毫秒）
    private long start = System.currentTimeMillis();

    /**
     * 在请求处理之前调用。用于记录请求开始时间。
     * @param httpServletRequest  HTTP 请求对象
     * @param httpServletResponse HTTP 响应对象
     * @param o 处理器对象
     * @return true 表示继续流程，false 表示中断
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        start = System.currentTimeMillis();// 记录当前时间为请求开始时间
        return true;
    }

    /**
     * 在请求处理完成后、视图渲染之前调用。用于输出请求耗时日志。
     * @param modelAndView 视图对象
     */
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        // 输出请求的 URI、参数、耗时和当前时间
        System.out.println("请求："+httpServletRequest.getRequestURI()+"?"+httpServletRequest.getQueryString()+"，耗时"+(System.currentTimeMillis()-start)+"ms  "+new Date());
    }

    /**
     * 在整个请求结束之后调用。
     * @param e 异常对象
     */
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    }
}